package mymyoux.utils
{
	import mymyoux.core.IObject;
	
	/**
	 * Stocke des fonctions dans un Array et sert d'Iterator.
	 * Permet ainsi dans les classes I/O de temporiser les actions.
	 * @author Mymyoux
	 * @version 1.0
	 */
	public class TamponFunctions implements IObject{
		/**
		 * Tableau contenant les fonctions a conserver.
		 */
		protected var functions:Array;
		/**
		 * Tableau contenant les scopes a conserver.
		 */
		protected var objects:Array;
		/**
		 * Tableau contenant les parametres de fonctions a conserver.
		 */
		protected var params:Array;
		/**
		 * Crée une instance de type TamponFunctions.
		 */
		public function TamponFunctions(){
			functions = new Array();
			objects = new Array();
			params = new Array();
		}
		/**
		 * Ajoute une fonction en attente
		 * @param f Fonction à ajouter.
		 * @param thisObject scope de référence.
		 * @param params Liste de paramètres.
		 */
		public function add(f:Function, thisObject:Object = null, ...params):void{
			functions.push(f);
			objects.push(thisObject);
			params.push(params);
		}
		/**
		 * Indique s'il reste des fonctions en attente
		 * @return <code><b>true</b></code> s'il en reste, <code><b>false</b></code> sinon.
		 */
		public function hasNext():Boolean{
			return functions.length>0;
		}
		/**
		 * Exécute la prochaine fonction
		 * @return <code><b>true</b></code> s'il reste une fonction en attente ensuite, <code><b>false</b></code> sinon.
		 */
		public function next():Boolean{
			if(hasNext()){
				var f:Function = functions.shift();
				var object:Object = objects.shift();
				var params:Array = params.shift();
				f.apply(object,params);
				return hasNext();
			}
			return false;
		}
		/**
		 * Renvoie le nombre de fonctions stockées.
		 */
		public function get length():uint{
			return functions.length;
		}
		/**
		 * @inheritDoc
		 */
		public function toString():String
		{
			return "[TamponFunctions length=\""+length+"\"]";
		}
		/**
		 * Removes all saved functions.
		 */
		public function clear():void
		{
			functions = new Array();
			objects = new Array();
			params = new Array();
		}
		/**
		 * @inheritDoc
		 */
		public function destroy():void
		{
			functions = null;
			objects = null;
			params = null;
		}
		/**
		 * @inheritDoc
		 */
		public function equals(objet:IObject):Boolean
		{
			return this===objet;
		}
	}
}